package Java比较器;

import org.junit.Test;
import java.util.Arrays;

/*
    需求
         Java中的对象,在正常情况下只能进行 "==" 或 "!=" 的比较,不能进行 "<" 或 ">" 的
          比较,但在实际开发中,需要对多个对象进行排序

     Java实现对象排序的两种方式
         自然排序:java.lang.Comparable
         定制排序:java.util.Comparator

    自然排序:java.lang.Comparable
         Comparable接口强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序
         实现 Comparable的类必须实现 compareTo(Object obj)方法,
            两个对象即通过 compareTo(Object obj)方法的返回值来比较大小,
            如果当前对象this大于形参对象obj,则返回正整数,
            如果当前对象this小于形参对象obj,则返回负整数,
            如果当前对象this等于形参对象obj,则返回零
         实现 Comparable接口的对象列表(和数组)可以通过 Collections.sort或 Arrays.sort进行自动排序,实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器
         对于类C的每一个 e1和 e2来说,当且仅当 e1.compareTo(e2) == 0与 e1.equals(e2)具有相同的 boolean值时,类 C的自然排序才叫做与 equals一致,建议(虽然不是必需的)最好使自然排序与 equals一致

    Comparable的典型实现:(默认都是从小到大排列的)
         String:按照字符串中字符的Unicode值进行比较
         Character:按照字符的Unicode值来进行比较
         数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值大小进行比较
         Boolean:true对应的包装类实例大于 false对应的包装类实例
         Date、Time等:后面的日期时间比前面的日期时间大

    Comparable和 Comparator接口对比
         Comparable接口方式一旦指定,便可以保证Comparable接口实现类的对象在任何位置都可以比较大小
         Comparator接口方式属于临时性的比较,需要的时候拿出来用一下即可
 */
public class CompareTest01 {

    /*
        自然排序:Comparable
            1、String,包装类等实现了Comparable,重写了compareTo(obj)方法,给出了比较两个对象大小的方式
            2、String,包装类等实现了Comparable接口以后,进行了从小到大的排序
            2、重写compareTo(obj)的规则:
                如果当前对象this大于形参对象obj,则返回正整数,
                如果当前对象this小于形参对象obj,则返回负整数,
                如果当前对象this等于形参对象obj则返回零
     */
    @Test
    public void test1(){
        //String实现了Comparable接口
        String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    @Test
    public void test2(){
        //如果自定义类需要排序,需要让自定义类实现Comparable接口,重写compareTo()方法,在该方法中指明如何排序
        Goods[] arr = new Goods[4];
        arr[0] = new Goods("联想",3000);
        arr[1] = new Goods("戴尔",5000);
        arr[2] = new Goods("小米",4000);
        arr[3] = new Goods("惠普",6000);
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}
